package mystudy
import "fmt"
// 多态
type Shape interface {
	Area() float64
}

/*
定义矩形类型
*/
type Rectangle struct{
	Width float64
	Height float64
}
// 实现方法
func (r Rectangle) Area() float64 {
	return r.Width * r.Height
}
// 特定方法
func (r Rectangle) GetHeight() float64{
	return r.Height
}
/*
定义圆形
*/
type Circle struct{
	Radius float64
}
// 定义圆形面积
func (c Circle) Area() float64{
	return 3.14 * c.Radius * c.Radius
}

// 公共方法
func DtTest(s Shape) {
	fmt.Println("公共方法:", s.Area())
	//因为GetHeight是矩形类独有的,所以这里需要转类型
	//这里使用断言 这个方法接收会出现报错,程序不会继续执行
	// var re Rectangle = s.(Rectangle)
	// 断言方法2
	re, ok := s.(Rectangle)
	fmt.Println(ok)
	fmt.Println(re.GetHeight())
}

func DtDemo(){
	shape := []Shape{
		Circle{10},
		Rectangle{10, 11},
	}	
	for i, shape := range shape{
		fmt.Printf("%T:", shape)
		fmt.Println(i, shape.Area())
		if sh, ok := shape.(Rectangle);ok{
			fmt.Println("======shape======", sh)
		}
		DtTest(shape)
		switch shape.(type){
			case Rectangle:
				fmt.Println("这是矩形")
				
			case Circle:
				fmt.Println("这是圆形")
		}
		var num int = 1
		// 验证fallthrough 无条件执行下一句
		// 验证使用变量
		switch num{
			case 1:
				fmt.Println("this is 1")
				fallthrough
			case 2:
				fmt.Println("this is 2")
			case 3:
				fmt.Println("this is 3")
			default :
				fmt.Println("this is defaule")
		}
		// 验证多个条件满足时,只执行第一个
		switch {
			case num <=1:
				fmt.Println("this is < 1")
			case num ==2:
				fmt.Println("this is ==2")
			case num <=10:{
				fmt.Println("this is <=10")
			}
			default:{
				fmt.Println("this is defaule switch ")
			}
		}

	}
}